export const arrayMethods = Object.create(Array.prototype);
const methods = [
    'push',
    'pop',
    'shift',
    'unshift',
    'splice',
    'sort',
    'reverse'
];
methods.forEach(method=>{
    const originalFn = arrayMethods[method];
    arrayMethods[method] = function(...args){
        // 这里用arguments的话还得自己转, 麻烦.
        // 调用数组的原来的方法
        const result = originalFn.apply(this, args);
        const arrayThis = this;
        let obArgs;
        switch(method){
            case 'push':
            case 'unshift':
                obArgs = args;
                break;
            case 'splice':
                // splice 第三个参数开始才是数据
                obArgs = args.slice(2);
                break;
            default:
                break;
        }
        if (obArgs){
            // 注意这里的 __ob__ 是进入 new Observer就被设置了, 这样这里也可以访问Observer的方法
            arrayThis.__ob__.observeArray(obArgs);
        }

        return result;
    };
})